<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/4/17
 * Time: 18:28
 * 公开不授权控制器
 */
namespace app\admin\controller;

use think\cache\driver\Redis;
use think\Loader;
use think\Session;
use think\Db;
use think\Config;
use think\Exception;
use think\Controller;
use app\admin\model\Operator;

class Pub extends Controller
{
   public function _initialize(){
       // 用户ID
       defined('UID') or define('UID', Session::get(Config::get('rbac.user_auth_key')));
   }

    /**
     * 检查用户是否登录
     */
    protected function checkUser()
    {
        if (null === UID) {
            if ($this->request->isAjax()) {
                ajax_return_adv_error("登录超时，请先登陆", "", "", "current", url("loginFrame"))->send();
            } else {
                $this->error("登录超时，请先登录", Config::get('rbac.user_auth_gateway'));
            }
        }

        return true;
    }

    /**
     * 用户登录页面
     * @return mixed
     */
    public function login()
    {
        if (Session::has(Config::get('rbac.user_auth_key'))) {
            $this->redirect('Index/index');
        } else {
            return view();
        }
    }

    /**
     * 小窗口登录页面
     * @return mixed
     */
    public function loginFrame()
    {
        return view();
    }

    /**
     * 首页
     */
    public function index()
    {
        //return \think\Response::create(\think\Url::build('Index/index'), 'redirect');
        // 如果通过认证跳转到首页
        $this->redirect('Index/index');
    }

    /**
     * 用户登出
     */
    public function logout()
    {
        if (UID) {
            //storage_user_action(Session::get(Config::get('rbac.user_auth_key')),Session::get('user_name'),0,1,'用户'.Session::get('user_name').'從'.$this->request->ip().'登出');
            //清除登录session
            Session::clear();
            //清除redis里面的权限
            $redis = new Redis();
            $name = UID . Config::get('rbac.redis_suffix');
            $redis->rm($name);
            $this->success('登出成功！', Config::get('rbac.user_auth_gateway'));
        } else {
            $this->error('已经登出！', Config::get('rbac.user_auth_gateway'));
        }
    }

    /**
     * 登录验证
     * @return \think\response\Json
     */
    public function checkLogin()
    {
        if ($this->request->isAjax() && $this->request->isPost()) {
            $data = $this->request->param();
            $validate = validate('app\admin\validate\PubValidate');
            if (!$validate->scene('login')->check($data)) {
                return ajax_return_adv_error($validate->getError());
            }

            $map['account'] = $data['account'];
            $map['status'] = 1;
            $auth_info = \Rbac::authenticate($map);

            // 使用用户名、密码和状态的方式进行认证
            if (null === $auth_info) {
                return ajax_return_adv_error('帐号不存在或已禁用！');
            } else {
                if ($auth_info['password'] != getDoubleMd5($data['password'], $auth_info['salt'])) {
                    return ajax_return_adv_error('账号或密码错误！');
                }
                //当前登录，其他位置账号失效
                $session_id = session_id();
                $old_session_id = $auth_info['session_id'];
                $session_file_path = session_save_path() . DIRECTORY_SEPARATOR . 'sess_' . $old_session_id;

                //删除上次用户登陆的session文件
                if(file_exists($session_file_path) && is_writable($session_file_path)) {
                    @unlink($session_file_path);
                }

                // 生成session信息
                Session::set(Config::get('rbac.user_auth_key'), $auth_info['id']);
                Session::set('user_name', $auth_info['account']);
                Session::set('user_password', $auth_info['password']);
                Session::set('user_salt', $auth_info['salt']);
                Session::set('last_login_ip', $auth_info['last_login_ip']);
                Session::set('last_login_time', $auth_info['last_login_time']);
                Session::set('user_id', $auth_info['id']);

                // 超级管理员标记
                if ($auth_info['id'] == 1) {
                    Session::set(Config::get('rbac.admin_auth_key'), true);
                }

                // 保存登录信息
                $update['last_login_time'] = time();
                $update['login_count'] = ['exp', 'login_count+1'];
                $update['last_login_ip'] = $this->request->ip();
                $update['session_id'] = $session_id;
                Db::name("operator")->where('id', $auth_info['id'])->update($update);

                //清除redis里面的权限
                $redis = new Redis();
                $name = $auth_info['id'] . Config::get('rbac.redis_suffix');
                if($redis->getHandler()->exists($name)){
                    $redis->rm($name);
                }

                return ajax_return_adv('登录成功！', '');
            }
        } else {
            throw new Exception("非法请求");
        }
    }

    /**
     * 修改密码
     */
    public function password()
    {
        $this->checkUser();
        if ($this->request->isPost()) {
            $data = $this->request->param();
            // 数据校验
            $validate = validate('app\admin\validate\PubValidate');
            if (!$validate->scene('password')->check($data)) {
                return ajax_return_adv_error($validate->getError());
            }

            // 查询旧密码进行比对
            $info = Db::name("operator")->where("id", UID)->field("password, salt")->find();
            if ($info['password'] != getDoubleMd5($data['oldpassword'], $info['salt'])) {
                return ajax_return_adv_error("旧密码错误");
            }

            // 写入新密码
            $salt = getRandomString(6);
            $password = getDoubleMd5($data['password'], $salt);
            $model = new Operator();
            if (false === $model->updatePassword(UID, $password, $salt)) {
                return ajax_return_adv_error("密码修改失败");
            }
            //重置存入session里面的值
            //Session::set('user_password', $password);
            //Session::set('user_salt', $salt);
            Session::clear();
            return ajax_return_adv('密码修改成功,请重新登录','parent','',false,'login');
            //return ajax_return_adv("密码修改成功,请重新登录", '');
        } else {
            return view();
        }
    }

    /**
     * 查看用户信息|修改资料
     */
    public function profile()
    {
        $this->checkUser();
        if ($this->request->isPost()) {
            // 修改资料
            $data = $this->request->only(['email', 'phone', 'remark'], 'post');
            $data['update_time'] = time();
            $data['update_by'] = UID;
            if (Db::name("Operator")->where("id", UID)->update($data) === false) {
                return ajax_return_adv_error("个人信息修改失败");
            }

            return ajax_return_adv("个人信息修改成功", '');
        } else {
            // 查看用户信息
            $info = Db::name("Operator")->field('account,email,phone,remark')->where("id", UID)->find();

            return $this->fetch('', compact('info'));
        }
    }

    /**
     * @todo 未授权页面
    */
    public function noAuth()
    {
        //Session::clear();
        $error = "403:未授权！";
        return $this->fetch('', compact('error'));
    }
}